// 定义 List 类型
interface List {
  // List 具有以 number string symbol 类型为键的属性
  // 该属性值类型为函数数组 
  [key: number | string | symbol]: Array<Function>
}
// 定义 BusClass 类型，用于约束 on 和 emit 方法
interface BusClass {
  // on 方法为注册自定义事件的处理函数
  // 即将对应的 callback 回调以 name 键名的形式注册到 list 对象上
  on: (name: string, callback: Function) => void
  // emit 方法为派发自定义事件的处理函数
  // 即根据 name 键名从 list 对象上搜寻对应的所有注册的自定义事件的处理函数，并根据传递的参数触发函数
  emit: (name: string) => void
}


// 定义 Bus 类，继承自 BusClass 用于注册和派发自定义事件
class Bus implements BusClass {
  // list 属性用于存储注册的事件
  list: List
  constructor() {
    this.list = {}
  }
  // on 方法，第一个参数为自定义事件名，第二个参数为自定义事件的处理函数
  // 该方法将对应的处理函数以自定义事件名为键的形式注册在 list 列表中
  // 注意：一个自定义事件名下可能有多个处理函数，故需以数组形式注册
  on(name: string, callback: Function) {
    let fn: Array<Function> = this.list[name] || []
    fn.push(callback)
    this.list[name] = fn
  }
  // emit 方法，第一个参数为自定义事件名，后续参数为需要传递给事件处理函数的参数
  // 该方法将以 name 为键注册的自定义事件处理函数逐一调用并传递对应的参数
  emit(name: string, ...args: Array<any>) {
    let fn: Array<Function> = this.list[name]
    fn.forEach((fun) => { fun.apply(this,args) })
  }
}
// 导出 Bus 的一个实例
export default new Bus()